شرح دورة أساسيات Kotlin

Kotlin هي لغة برمجة حديثة تم تطويرها بواسطة JetBrains. تُستخدم بشكل أساسي لتطوير تطبيقات Android، لكنها أيضًا تُستخدم في تطوير تطبيقات الويب وسيرفرات الخلفية (Back-end) وحتى تطبيقات سطح المكتب.

الدرس الأول: أساسيات Kotlin

Kotlin هي لغة برمجة حديثة تم تطويرها بواسطة JetBrains. تُستخدم بشكل أساسي لتطوير تطبيقات Android، لكنها أيضًا تُستخدم في تطوير تطبيقات الويب وسيرفرات الخلفية (Back-end) وحتى تطبيقات سطح المكتب.

شرح مفصل:
  • 1. تشغيل أول برنامج في Kotlin: يمكنك تشغيل أول برنامج في Kotlin باستخدام دالة `main`.
  • 2. المتغيرات في Kotlin: يمكن تعريف المتغيرات باستخدام `val` (ثابت لا يتغير) أو `var` (متغير يمكن تغييره لاحقًا).
  • 3. أنواع البيانات (Data Types): مثل `Int` للأعداد الصحيحة، `Double` للأرقام العشرية، `String` للنصوص، و `Boolean` للقيم المنطقية.
مثال:
fun main() { println("مرحبًا بك في Kotlin!") }
val name = "Ali" // لا يمكن تغيير قيمته var age = 25 // يمكن تغييره لاحقًا age = 26 // ✅ هذا مسموح // name = "Omar" ❌ سيؤدي إلى خطأ لأنه val
val number: Int = 10 val price: Double = 19.99 val message: String = "Hello Kotlin" val isStudent: Boolean = true

الدرس الثاني: المحددات في Kotlin

المحددات (Modifiers) في Kotlin تُستخدم للتحكم في سلوك المتغيرات، الدوال، والصفوف. هناك أنواع مختلفة من المحددات، مثل محددات الوصول، محددات الأصناف والدوال، ومحددات التغير.

شرح مفصل:
  • 1. محددات الوصول: مثل `private`، `protected`، و `public`.
  • 2. محددات الأصناف والدوال: مثل `open`، `override`، و `final`.
  • 3. محددات التغير: مثل `const`.
مثال:
class Person { private val secret = "هذه معلومة خاصة" internal val age = 30 protected val name = "أحمد" } fun main() { val person = Person() println(person.age) // ✅ مسموح (لأنه internal) // println(person.secret) ❌ غير مسموح (لأنه private) }
open class Animal { open fun makeSound() { println("صوت غير محدد") } } class Dog : Animal() { override fun makeSound() { println("Woof! Woof!") } } fun main() { val dog = Dog() dog.makeSound() // Woof! Woof! }
object Constants { const val PI = 3.14 } fun main() { println(Constants.PI) }

الدرس الثالث: التصفح في Kotlin

التنقل بين الشاشات في تطبيقات Android باستخدام Kotlin، فهناك عدة طرق للتصفح بين الأنشطة (Activities) أو الواجهات (Fragments).

شرح مفصل:
  • 1. التنقل بين الأنشطة: باستخدام `Intent`.
  • 2. تمرير البيانات بين الأنشطة: باستخدام `Extras` داخل `Intent`.
  • 3. التنقل بين الـ Fragments باستخدام FragmentManager: يمكنك التنقل بين Fragments باستخدام `FragmentManager`.
مثال:
import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import android.widget.Button class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val button = findViewById

الدرس الرابع: الأنماط المتقدمة

إذا كنت تبحث عن أنماط البرمجة المتقدمة في Kotlin، فإليك بعض المفاهيم القوية التي تساعد في كتابة كود نظيف وفعال.

شرح مفصل:
  • 1. البرمجة الوظيفية: Kotlin تدعم البرمجة الوظيفية، مما يعني أنه يمكنك التعامل مع الدوال ككائنات وتمريرها كمعاملات.
  • 2. البرمجة الكائنية المتقدمة: Kotlin توفر ميزات قوية مثل التفويض (Delegation) والميراث (Inheritance) والبيانات غير القابلة للتغيير (Immutable Objects).
  • 3. الأصناف المتقدمة: تستخدم `sealed class` لإنشاء تسلسل هرمي من الكائنات بطريقة آمنة.
مثال:
fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } fun main() { val sum = operateOnNumbers(5, 3) { x, y -> x + y } println(sum) // 8 }
interface Logger { fun log(message: String) } class ConsoleLogger : Logger { override fun log(message: String) = println("Log: $message") } class UserService(logger: Logger) : Logger by logger fun main() { val service = UserService(ConsoleLogger()) service.log("تم إنشاء مستخدم جديد") // Log: تم إنشاء مستخدم جديد }
sealed class Result class Success(val data: String) : Result() class Error(val message: String) : Result() fun handleResult(result: Result) { when (result) { is Success -> println("نجاح: ${result.data}") is Error -> println("خطأ: ${result.message}") } }

الدرس الخامس: مشروع عملي - تطبيق آلة حاسبة بسيطة

المشروع سيكون تطبيق آلة حاسبة يحتوي على واجهة مستخدم (UI) يمكن للمستخدم من خلالها إجراء العمليات الحسابية الأساسية (الجمع، الطرح، الضرب، القسمة).

شرح مفصل:
  • الفكرة: تطبيق آلة حاسبة بسيطة: سنقوم بإنشاء تطبيق آلة حاسبة بسيطة باستخدام Kotlin.
مثال:
@IBOutlet weak var displayLabel: UILabel! @IBAction func numberPressed(_ sender: UIButton) { let number = sender.titleLabel?.text displayLabel.text = displayLabel.text! + number! }

الدرس السادس: الجمل الشرطية والحلقات

الجمل الشرطية والحلقات هي أدوات أساسية في البرمجة تسمح باتخاذ القرارات وتكرار العمليات.

شرح مفصل:
  • 1. الجمل الشرطية: مثل `if`، `else`، و `else if`.
  • 2. الحلقات: مثل `for`، `while`، و `do-while`.
مثال:
val age = 18 if (age >= 18) { println("أنت بالغ.") } else { println("أنت قاصر.") }
for (i in 0..<5) { println("الرقم: $i") }

الدرس السابع: الدوال (Functions)

الدوال هي كتل من الكود يمكن استدعاؤها لتنفيذ مهمة محددة. تساعد في تنظيم الكود وإعادة استخدامه.

شرح مفصل:
  • 1. تعريف الدوال: يتم تعريف الدوال باستخدام الكلمة المفتاحية `fun`.
  • 2. استدعاء الدوال: يمكن استدعاء الدوال باستخدام اسمها.
مثال:
fun greet(name: String) { println("مرحبًا، $name!") } fun main() { greet("علي") // ✅ مرحبًا، علي! }

الدرس الثامن: المصفوفات (Arrays)

المصفوفات هي هياكل بيانات تخزن مجموعة من العناصر في ترتيب معين. يمكن الوصول إلى العناصر باستخدام الفهرس.

شرح مفصل:
  • 1. إنشاء المصفوفات: يتم إنشاء المصفوفات باستخدام الأقواس المربعة `[]`.
  • 2. الوصول إلى العناصر: يمكن الوصول إلى العناصر باستخدام الفهرس.
مثال:
val numbers = arrayOf(1, 2, 3, 4, 5) println(numbers[0]) // ✅ 1

الدرس التاسع: الهاش (Hashes)

الهاش هو هيكل بيانات يخزن البيانات في أزواج مفتاح-قيمة. يمكن استخدامه لتخزين البيانات المرتبطة.

شرح مفصل:
  • 1. إنشاء الهاش: يتم إنشاء الهاش باستخدام الأقواس المعقوفة `{}`.
  • 2. الوصول إلى القيم: يمكن الوصول إلى القيم باستخدام المفتاح.
مثال:
val person = mapOf("name" to "علي", "age" to "25") println(person["name"]) // ✅ علي

الدرس العاشر: الاستثناءات (Exceptions)

الاستثناءات هي أخطاء تحدث أثناء تنفيذ البرنامج. يمكن التعامل معها باستخدام `try`، `catch`، و `finally`.

شرح مفصل:
  • 1. التعامل مع الاستثناءات: يتم استخدام `try` و `catch` للتعامل مع الأخطاء.
  • 2. الكود النهائي: يتم استخدام `finally` لتنفيذ كود بغض النظر عن حدوث استثناء أم لا.
مثال:
try { val result = 10 / 0 } catch (e: ArithmeticException) { println("حدث خطأ: ${e.message}") } finally { println("هذا الكود سيتم تنفيذه دائمًا.") }